/**
 * uniCloud网络配置和工具类
 * 用于统一管理uniCloud调用和错误处理
 */

class UniCloudService {
  constructor() {
    this.isInitialized = false;
    this.serverDomains = {
      // uniCloud阿里云服务器域名（需要在微信小程序管理后台配置）
      request: [
        'https://api.next.bspapp.com', // uniCloud新版API域名 
      ],
      upload: [
        'https://file-uniumnhyee-mp-60938b8b-b700-49f1-92ca-7e2f424b6674.oss-cn-zhangjiakou.aliyuncs.com' // 文件上传域名
      ],
      download: [
        'https://mp-60938b8b-b700-49f1-92ca-7e2f424b6674.cdn.bspapp.com' // 文件下载域名
      ]
    };
  }

  /**
   * 初始化uniCloud
   */
  init() {
    if (this.isInitialized) return;
    
    try {
      // uniCloud会在编译时自动注入配置
      // 小程序环境下会自动初始化，无需手动处理
      this.isInitialized = true;
      console.log('uniCloud初始化成功');
    } catch (error) {
      console.error('uniCloud初始化失败:', error);
    }
  }

  /**
   * 调用云函数的封装方法
   * @param {String} name 云函数名称
   * @param {Object} data 传递给云函数的数据
   * @returns {Promise} 云函数调用结果
   */
  async callFunction(name, data = {}) {
    try {
      // 确保uniCloud已初始化
      this.init();
      
      console.log(`调用云函数: ${name}`, data);
      
      const result = await uniCloud.callFunction({
        name: name,
        data: data
      });
      
      console.log(`云函数${name}调用成功:`, result);
      
      // 检查云函数返回的错误
      if (result.result && result.result.code !== 200) {
        console.warn(`云函数${name}返回错误:`, result.result);
      }
      
      return result;
      
    } catch (error) {
      console.error(`云函数${name}调用失败:`, error);
      console.error('详细错误信息:', {
        code: error.code,
        message: error.message,
        errCode: error.errCode,
        errMsg: error.errMsg,
        requestId: error.requestId
      });
      
      // 根据错误类型返回不同的错误信息
      let errorMessage = '网络连接失败';
      
      if (error.code === 'FUNCTION_NOT_FOUND' || error.errCode === 'FUNCTION_NOT_FOUND') {
        errorMessage = '云函数不存在，请检查云函数是否已正确上传';
      } else if (error.code === 'NETWORK_ERROR' || error.errCode === 'NETWORK_ERROR') {
        errorMessage = '网络连接错误，请检查网络设置和域名配置';
      } else if (error.code === 'TIMEOUT' || error.errCode === 'TIMEOUT') {
        errorMessage = '请求超时，请重试';
      } else if (error.code === 'INVALID_PARAM' || error.errCode === 'INVALID_PARAM') {
        errorMessage = '参数错误，请检查提交的数据格式';
      } else if (error.code === 'PERMISSION_ERROR' || error.errCode === 'PERMISSION_ERROR') {
        errorMessage = '权限错误，请检查uniCloud服务空间配置';
      } else if (error.errMsg) {
        errorMessage = error.errMsg;
      } else if (error.message) {
        errorMessage = error.message;
      }
      
      throw {
        code: error.code || error.errCode || 'UNKNOWN_ERROR',
        message: errorMessage,
        originalError: error
      };
    }
  }

  /**
   * 上传文件到云存储
   * @param {String} filePath 文件路径
   * @param {String} cloudPath 云端存储路径
   * @returns {Promise} 上传结果
   */
  async uploadFile(filePath, cloudPath) {
    try {
      console.log('上传文件到云存储:', filePath, '->', cloudPath);
      
      const result = await uniCloud.uploadFile({
        filePath: filePath,
        cloudPath: cloudPath
      });
      
      console.log('文件上传成功:', result);
      return result;
      
    } catch (error) {
      console.error('文件上传失败:', error);
      throw {
        code: error.code || 'UPLOAD_ERROR',
        message: '文件上传失败',
        originalError: error
      };
    }
  }

  /**
   * 获取服务器域名配置信息
   * 用于微信小程序管理后台配置
   */
  getServerDomains() {
    return this.serverDomains;
  }

  /**
   * 检查网络连接状态
   */
  async checkNetworkStatus() {
    return new Promise((resolve) => {
      uni.getNetworkType({
        success: (res) => {
          console.log('网络类型:', res.networkType);
          resolve({
            isConnected: res.networkType !== 'none',
            networkType: res.networkType
          });
        },
        fail: () => {
          resolve({
            isConnected: false,
            networkType: 'unknown'
          });
        }
      });
    });
  }
}

// 创建单例实例
const uniCloudService = new UniCloudService();

// 导出实例
export default uniCloudService;

// 同时导出域名配置，方便在其他地方使用
export const SERVER_DOMAINS = {
  request: [
    'https://api.next.bspapp.com'
  ],
  upload: [
    'https://file-uniumnhyee-mp-60938b8b-b700-49f1-92ca-7e2f424b6674.oss-cn-zhangjiakou.aliyuncs.com'
  ],
  download: [
    'https://mp-60938b8b-b700-49f1-92ca-7e2f424b6674.cdn.bspapp.com'
  ]
};
